Системы контроля версий
Кирилл Корняков (Itseez, ННГУ)
3 Марта 2016
Содержание
Системы контроля версий
Git
Модели рабочего процесса (командная работа)
Заключение
Тест Джоэла
Joel Spolsky, August 09, 2000
Коллективная работа с кодом
История изменений
Откат дефектных изменений
Извлечение кода "из прошлого" (как оно раньше работало?)
Поиск ошибок сравнением (кто это сделал?)
Централизованное хранение
Актуальное и используемое всеми участниками (где последняя версия?!)
Защищенное, с разграничением прав доступа
Машина времени и сетевое хранилище в одном флаконе!
Нужны ли специальные инструменты? Вспоминаем Sharepoint, tarballs.
Системы контроля версий
Системы контроля версий — это программные системы, хранящие несколько версий одного документа, и позволяющие вернуться к более ранним версиям. Как правило, для каждого изменения запоминается дата модификации и автор.
Патчи
Патч (англ. patch — заплатка) — информация, предназначенная для автоматизированного внесения определённых изменений в компьютерные файлы.
Unified diff format : @@ -l,s +l,s @@ optional section heading
Отображение в командной строке
Патчи
Патч — это простой текстовый файл, его можно наложить при помощи инструментов (patch).
Один патч может содержать изменения сразу нескольких файлов в разных директориях.
Люди могут обмениваться изменениями, посылая друг другу патчи.
Патч — это атомарное изменение проекта!
Патчи и СКВ
СКВ — это своего рода БД патчей, ее называют репозиторием .
Патчи, помещенные в СКВ называются commit .
Последовательности commit называются changeset .
История изменений
ddc4a1d — Readme bug fixes.
- README.md
f9e76e6 — Remove dummy implementation
- include/filters.hpp
- samples/matrix_sample.cpp
- src/filters_dummy.cpp
- src/filters_fabrics.cpp
- test/filters_test.cpp
aa1611b — Switch from strings to enums
- include/filters.hpp
- samples/matrix_sample.cpp
- src/filters_fabrics.cpp
- test/filters_test.cpp
8e8b21b — Add some error checking
- include/filters.hpp
- src/filters_fabrics.cpp
- test/filters_test.cpp
Последовательность патчей — это полная история проекта.
Визуализация истории изменений
VIDEO
Три поколения СКВ
First
None
One file at a time
Locks
RCS, SCCS
Second
Centralized
Multi-file
Merge before commit
CVS, Subversion, SourceSafe, Team Foundation Server
Third
Distributed
Changesets
Commit before merge
Git, Mercurial, Bazaar
Eric Sink "A History of Version Control"
Три поколения СКВ: Локальные
Примеры: RCS, SCCS
Организация одновременной работы: locks
Три поколения СКВ: Централизованные
Примеры: Subversion, CVS
Организация одновременной работы: merge before commit
Три поколения СКВ: Распределенные
Примеры: Git, Mercurial
Организация одновременной работы: commit before merge
Преимущества распределенных СКВ (DVCS)
Допускают локальную работу (коммиты без наличия интернет)
Упрощают слияние (а значит параллельную разработку)
Дают максимальную свободу по организации рабочего процесса (workflow)
Благодаря этому, они фактически стали стандартом де-факто.
Компании и проекты, использующие Git
Git
Разработан Линусом Торвальдсом для работы над ядром Linux в 2005 году.
В настоящее время поддерживается Джунио Хамано, сотрудником Google.
Не очень прост в освоении, однако очень быстрый и функциональный.
Имеет наиболее "сильное" сообщество, инструментальную поддержку.
Огромное количество информации в интернет: инструкции, уроки, статьи
Официальный сайт проекта: http://www.git-scm.org .
Pro Git
Лучшая книга про Git
Доступна бесплатно
Переведена на русский язык
Единственный способ по-настоящему понять Git — это узнать как он работает
Нужно прочесть хотя бы первые 100 страниц
Как сказал Евклид египетскому царю Птолемею:
«Царской дороги в геометрии нет!»
Git objects
По сути это внутреннее представление патча
Пользователю приходится работать только с коммитами (слава богу!)
Показать содержимое коммита:
$ git show --raw dc2ca9d95c
commit dc2ca9d95cbd5586e9e5ef0fe1ce7db91ea7d3d1
Author: Daniil Osokin <daniil.osokin@itseez.com>
Date: Sun Aug 16 14:35:44 2015 +0300
Switched to factory
:100644 100644 afadff2... bde857e... M README.md
:100644 000000 c977bf3... 0000000... D src/filters_fabrics.cpp
:000000 100644 0000000... c977bf3... A src/filters_factory.cpp
Git commits
Вывести историю изменений:
$ git log
commit aaa321be9191da60ad52c2bc41bd749ed546b409
Merge: 98fce98 3c1d15a
Author: Valentina <valentina-kustikova@users.noreply.github.com>
Date: Thu Aug 13 10:14:47 2015 +0300
Merge pull request #11 from valentina-kustikova/master
Practice description (bug fixes).
commit 3c1d15a1bf366864593f2320fa9a0e6cf3586f52
Author: valentina-kustikova <valentina.kustikova@gmail.com>
Date: Thu Aug 13 10:08:59 2015 +0300
Practice description (bug fixes).
Понятие ветки (branch)
Ветка в Git'е — это просто указатель на один из коммитов.
Есть соглашение, что имя master используется для ветки,
указывающей на последнее актуальное состояние проекта.
Вывести список существующих веток:
$ git branch
* master
Git branch
Создать новую ветку с именем testing (указатель на коммит!):
$ git branch testing
Текущий список веток:
$ git branch
* master
testing
HEAD
HEAD — специальный указатель, ссылающийся на локальную ветку, на которой вы находитесь.
Это просто алиас (псевдоним) для текущей ветки, введенный для удобства.
Git checkout
Извлечь состояние репозитория, соответствующее ветке testing:
$ git checkout testing
Вывести список существующих веток:
$ git branch
master
* testing
Три состояния файлов
Git commit
$ vim README.md
$ git add README.md
$ git commit -m 'Made a change'
Go back to master
Make a commit to master
$ vim main.cpp
$ git add main.cpp
$ git commit -m 'Made other changes'
# Или можно сделать так
$ git status
$ git commit -a -m 'Made other changes'
Merging
Merging
С6 — это так называемый merge commit
Он основан не на каком-то патче, он указывает на состояние проекта,
в котором наложены патчи обоих ветвей (master и testing).
Merge Conflicts
Возникают когда несколько участников отредактировали одинаковые строки,
или когда это произошло в разных ветках.
Разрешаются человеком при помощи инструментов (git mergetool).
В реальности довольно редкая ситуация, если соблюдать практики:
Грамотное распределение задач
Частые коммиты, много маленьких веток, частая интеграция
Multiple Branches
Даже у одного разработчика может быть несколько активных веток.
Правильно создавать отдельную ветку на каждую логически независимую задачу.
Долгоживущие ветки — это неправильно, они быстро устаревают.
Современное состояние
Использование в ИТ-проектах:
Фундаментальный инструмент разработки
Также используется для: файлы конфигурации, документация, тестовые данные и пр.
Нестандартные применения Git
Хранилище для веб-контента: GitHub pages , devtools page .
Легковесная база данных.
Git можно использовать программно при помощи libgit2 , практически из любого популярного языка.
Резюме
Системы контроля версий — центральный инструмент разработки
Навигация по истории изменений
Централизованный доступ
Имеются и другие применения:
Распределенные СКВ фактически стали стандартом. Их сильные стороны:
Допускают локальные коммиты (без наличия интернет или доступа к серверу)
Упрощают слияние (а значит параллельную разработку)
Дают максимальную свободу по организации рабочего процесса (workflow)
Git не самая простая в освоении СКВ, однако очень функциональная,
к тому же дает максимальную свободу по организации процесса разработки.
Контрольные вопросы
Определение СКВ
Основные функции/возможности современных СКВ
Преимущества DVCS